//using System;
//using UnityEngine;
//using UnityEngine.Assertions;
//using XLua;
//using System.IO;
//using FunPlus.Common.Script;
//using System.Runtime.InteropServices;
//#if UNITY_EDITOR
//using UnityEditor;
//#endif

//[LuaCallCSharp]
//public class LuaManager
//{
//    private LuaEnv luaEnv;
//    private Action luaTickFunc;
//    private bool isLuaDisposed = false;

//    public LuaEnv LuaEnv
//    {
//        get
//        {
//            // luaEnv must be initialized before use.
//            Assert.IsNotNull(luaEnv);
//            return luaEnv;
//        }
//    }
//#if UNITY_EDITOR_WIN || UNITY_STANDALONE_WIN || XLUA_GENERAL || (UNITY_WSA && !UNITY_EDITOR)

//#if (!UNITY_STANDALONE_OSX)
//    private static System.Text.StringBuilder sampleText = new System.Text.StringBuilder(256);

//    [MonoPInvokeCallback(typeof(XLua.LuaDLL.lua_HookFunction))]
//    internal static void UnityProfileLuaHook(System.IntPtr L, System.IntPtr ar)
//    {
//        sampleText.Clear();
//        XLua.LuaDLL.Lua.lua_getinfo(L, "nS", ar);
//        XLua.LuaDLL.Lua.lua_Debug dar = Marshal.PtrToStructure<XLua.LuaDLL.Lua.lua_Debug>(ar);
//        if (dar.what != "C")
//        {
//            if (dar.devent == 0)
//            {
//                // call
//                // Debug.Log("call " + dar.short_src + "_" + dar.name);
//                sampleText.AppendFormat("{0}:{1}:{2}", dar.short_src, dar.name, dar.linedefined > 0 ? dar.linedefined : 0);
//                UnityEngine.Profiling.Profiler.BeginSample(sampleText.ToString());
//            }
//            else if (dar.devent == 1 || dar.devent == 4)
//            {
//                // ret tail return
//                // Debug.Log("ret " + dar.short_src + "_" + dar.name);
//                UnityEngine.Profiling.Profiler.EndSample();
//            }
//        }
//    }
//#endif
//#endif
//    public void LuaProfileHook(bool enable)
//    {
//#if UNITY_EDITOR_WIN || UNITY_STANDALONE_WIN || XLUA_GENERAL || (UNITY_WSA && !UNITY_EDITOR)
//#if (!UNITY_STANDALONE_OSX)
//        if (enable)
//        {
//            XLua.LuaDLL.Lua.xlua_setunityprofilehook(luaEnv.rawL, UnityProfileLuaHook);
//        }
//        else
//        {
//            XLua.LuaDLL.Lua.lua_sethook(luaEnv.rawL, System.IntPtr.Zero, 0, 0);
//        }
//#if UNITY_EDITOR
//        // 为了演示，自动打开Profiler窗口。正常接入时建议不要这么做
//        //        var type = typeof(EditorWindow).Assembly.GetType("UnityEditor.ProfilerWindow");
//        //        EditorWindow window = EditorWindow.GetWindow(type);
//        //        if (!enable)
//        //            window.Close();
//#endif
//#else
//     Debug.Log("!!!Mac canot support luaHook");
//#endif
//#endif
//    }

//    public LuaTable Global
//    {
//        get
//        {
//            return LuaEnv.Global;
//        }
//    }

//    public void BindGameTickFunc()
//    {
//        luaTickFunc = luaEnv.Global.Get<Action>(LuaConst.LuaTickFuncName);
//        Assert.IsNotNull(luaTickFunc, "Cannot find tick function in Lua");
//    }

//    public void BindCallbacks()
//    {

//    }

//    void CallLuaGlobalFunction(string funcName)
//    {
//        var func = luaEnv.Global.Get<Action>(funcName);
//        if (func is null)
//        {
//            Debug.LogError("Cannot find global lua function:" + funcName);
//            return;
//        }
//        func();
//    }

//    public string GetTrackBack()
//    {
//        if (luaEnv != null)
//        {
//            var rets = luaEnv.DoString("return debug.traceback()");

//            return rets[0].ToString();
//        }
//        return "";
//    }

//    void PrepareLuaEnv()
//    {
//        Assert.IsNull(luaEnv);

//        luaEnv = new LuaEnv();
//        // If in dev mode, prefer to read lua files in DebugLua folder under the persistent folder
//        string ClipString = DEngine.ClipBufferParser.instance.GetClipParam("isDebug");
//        bool isLoadDebugLua = false;

//        if (!string.IsNullOrEmpty(ClipString))
//        {
//            isLoadDebugLua = Convert.ToBoolean(ClipString);
//        }

//#if DEVELOPMENT_BUILD
//             isLoadDebugLua = true;
//#if UNITY_STANDALONE_WIN
//             luaEnv.AddLoader(StreamingLuaLoader.Load);
//#endif
//#endif

//        if (isLoadDebugLua)
//        {
//            luaEnv.AddLoader(DebugLuaLoader.Load);
//        }

//        //
//        luaEnv.AddLoader(RawLuaLoader.Load);
//        //luaEnv.DoString("package.path=package.path..';" + LuaConst.LuaDir + "?.lua" + "'");

//        string luaCmd = string.Format("require '{0}'", LuaConst.LuaEntranceScript);
//        luaEnv.DoString(luaCmd);
//        BindGameTickFunc();

//    }

//    void ResetLuaFuncs()
//    {
//        // TODO: Immortal lua callbacks should be managed in a special manager.
//        luaTickFunc = null;
//        if (luaEnv != null && isLuaDisposed == false)
//        {
//            isLuaDisposed = true;
//            CallLuaGlobalFunction(LuaConst.LuaDisposeFuncName);
//        }
//    }

//    public void Awake()
//    {
//        PrepareLuaEnv();
//        CallLuaGlobalFunction(LuaConst.LuaInitFuncName);
//    }

//    public void Start()
//    {
//        CallLuaGlobalFunction(LuaConst.LuaStartFuncName);
//    }

//    public void Update()
//    {
//        if (luaEnv != null)
//        {
//            luaEnv.Tick();
//        }

//        if (luaTickFunc != null)
//        {
//            luaTickFunc();
//        }
//#if UNITY_EDITOR
//        if (!UnityEditor.EditorApplication.isPlayingOrWillChangePlaymode && UnityEditor.EditorApplication.isPlaying)
//        {
//            ResetLuaFuncs();
//        }
//#endif
//    }

//    // Debug Command (Reload and so on)
//    public void OnLuaGUI()
//    {
//        if (Event.current.isKey || Event.current.isScrollWheel)
//        {
//            CallLuaGlobalFunction(LuaConst.LuaOnGUIEventFuncName);
//        }
//    }

//    public void Destroy()
//    {
//        ResetLuaFuncs();
//        if (luaEnv != null)
//        {
//            luaEnv.Dispose();
//        }
//    }
//}


